package cn.tedu.truetaste.service.impl;

import cn.tedu.truetaste.ex.ServiceException;
import cn.tedu.truetaste.mapper.CommentMapper;
import cn.tedu.truetaste.mapper.DishesMapper;
import cn.tedu.truetaste.mapper.OrderMapper;
import cn.tedu.truetaste.pojo.dto.CommentAddNewDTO;
import cn.tedu.truetaste.pojo.dto.CommentUpdateDTO;
import cn.tedu.truetaste.pojo.entity.Comment;
import cn.tedu.truetaste.pojo.vo.*;
import cn.tedu.truetaste.service.ICommentService;
import cn.tedu.truetaste.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class CommentServiceImpl implements ICommentService {

    @Autowired
    private CommentMapper commentMapper;
    @Autowired
    private DishesMapper dishesMapper;

    public CommentServiceImpl() {
        log.info("创建业务对象：CommentServiceImpl");
    }

    @Override
    public void addNew(CommentAddNewDTO commentAddNewDTO) {
        log.debug("开始处理【添加评论】的业务，参数：{}", commentAddNewDTO);
        Long dishesId = commentAddNewDTO.getDishesId();
        DishesStandardVO dishesStandardVO = dishesMapper.getStandardById(dishesId);
        // 判断评论所属菜品是否存在
        if (dishesStandardVO == null) {
            String message = "添加评论失败！菜品不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 准备需要添加到数据库的对象
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentAddNewDTO, comment);

        // 执行插入数据
        int rows = commentMapper.insert(comment);
        if (rows != 1) {
            String message = "添加评论失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除评论】的业务，参数：{}", id);
        // 检查尝试删除的评论是否存在
        Object queryResult = commentMapper.getStandardById(id);
        if (queryResult == null) {
            String message = "删除评论失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        int rows = commentMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除评论失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        log.debug("删除完成！");
    }

    @Override
    public void updateInfoById(String openId, CommentUpdateDTO commentUpdateDTO) {
        log.debug("开始处理【修改评论详情】的业务，参数ID：{}，新数据：{}",openId, commentUpdateDTO);

        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            CommentStandardVO comment = commentMapper.getStandardByOpenId(openId);
            // 是：数据不存在，抛出异常
            if (comment == null) {
                String message = "修改评论详情失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        // 创建Picture对象
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentUpdateDTO, comment);
        comment.setOpenId(openId);
        log.debug("即将执行修改数据，参数：{}", comment);
        int rows = commentMapper.update(comment);
        if (rows != 1) {
            String message = "修改评论详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public CommentStandardVO getStandardByOpenId(String openId) {
        log.debug("开始处理【根据微信id查询评论详情】的业务，参数：{}", openId);

        // 调用Mapper的getStandardById()执行查询
        CommentStandardVO comment = commentMapper.getStandardByOpenId(openId);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (comment == null) {
            String message = "查询评论详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", comment);
        return comment;
    }

    @Override
    public CommentStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询评论详情】的业务，参数：{}", id);

        // 调用Mapper的getStandardById()执行查询
        CommentStandardVO comment = commentMapper.getStandardById(id);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (comment == null) {
            String message = "查询评论详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", comment);
        return comment;
    }

    @Override
    public List<CommentListItemVO> list() {
        log.debug("开始处理【查询评论列表】的业务，无参数");
        List<CommentListItemVO> list = commentMapper.list();
        log.debug("即将返回查询结果：{}", list);
        return list;
    }
}
